﻿// Jinx AJAX Framework
// Copyright (C) 2008 Blake Hegerle
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

using System.Collections.Generic;
using System.IO;

namespace Core.Json
{
    public static class Deserializer
    {
        public static IDictionary<string, object> MapJson(this string Json)
        {
            return new StringReader(Json).MapJson();
        }

        public static IDictionary<string, object> MapJson(this TextReader Json)
        {
            var Lexer = new JsonLexer(Read(Json));

            return JsonParser.Parse(Lexer);
        }

        public static T JsonToObject<T>(this string Json)
            where T : new()
        {
            return Json.MapJson().ToObject<T>();
        }

        public static T JsonToObject<T>(this TextReader Json)
            where T : new()
        {
            return Json.MapJson().ToObject<T>();
        }

        public static T ToObject<T>(this IDictionary<string, object> ParsedJson)
            where T : new()
        {
            var NewInstance = new T();

            foreach (var Member in ParsedJson)
                NewInstance.CoerciveSet(Member.Key, Member.Value);

            return NewInstance;
        }

        private static IEnumerable<char> Read(TextReader Reader)
        {
            using (Reader)
            {
                while (true)
                {
                    var i = Reader.Read();

                    if (i == -1)
                        break;

                    yield return (char) i;
                }
            }
        }
    }
}